home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Camelot / Camelot 043 (1989-06)(Swedish User Group of Amiga)(SE)(PD)[WB].zip / Camelot 043 (1989-06)(Swedish User Group of Amiga)(SE)(PD)[WB].adf / Glib / dw8000.c < prev    next >
C/C++ Source or Header  |  1989-03-16  |  15KB  |  645 lines

  1. /*
  2.  * GLIB - a Generic LIBrarian and editor for synths
  3.  *
  4.  * DW8000 Librarian
  5.  *
  6.  * Code completed 8/24/87 --  Steven A. Falco  moss!saf
  7.  */
  8.  
  9. #define OVERLAY2
  10.  
  11. #include "glib.h"
  12.  
  13. #define DW8VSIZE 51
  14.  
  15. char *visnum(), *visd8wave(), *visd8oct(), *visd8trk();
  16. char *visd8ival(), *visd8detu(), *visd8asel(), *dw8vnum(), *visd8amod();
  17. char *visd8mgw(), *visd8mode(), *visd8pol(),*visd8sem(), *visonoff();
  18.  
  19. /* This array contains arbitrary screen labels */
  20. struct labelinfo Ldw800[] = {
  21.  2,0,"+----------------------------------+----------------+------------------+------+",
  22.  3,0,"|         Osc 1     Osc 2     Noise|          ModGen|          AutoBend| Mode |",
  23.  4,0,"|Octave",4,35,"|Waveform",4,52,"|Select",4,71,"|      |",
  24.  5,0,"|Waveform",5,35,"|Frequency",5,52,"|Mode",5,71,"|      |",
  25.  6,0,"|Level",6,35,"|Delay",6,52,"|Time",6,71,"|      |",
  26.  7,0,"|Interval",7,35,"|Osc",7,52,"|Intensity",7,71,"|      |",
  27.  8,0,"|Detune",8,35,"|VCF",8,52,"|",8,71,"|      |",
  28.  9,0,"+------------------+---------------+----------------+------------------+------+",
  29. 10,0,"|",10,11,"VCF  VCA|",10,30,"Delay|    Joystick    |     Portamento   |Key   |",
  30. 11,0,"|Attack",11,19,"|Time",11,35,"|Osc",11,52,"|Time",11,71,"|Param |",
  31. 12,0,"|Decay",12,19,"|Factor",12,35,"|VCF",12,52,"|",12,71,"|      |",
  32. 13,0,"|Break Pt.",13,19,"|Feedback",13,35,"+----------------+------------------+------+",
  33. 14,0,"|Slope",14,19,"|Frequency      |",
  34. 15,0,"|Sustain",15,19,"|Intensity      | +-------------------------+--------------+",
  35. 16,0,"|Release",16,19,"|Eff.Level      | |Space = Play Note",16,63,"| Auto-Note    |",
  36. 17,0,"|V.Sensitv",17,19,"+---------------+ |",17,63,"|",17,78,"|",
  37. 18,0,"|Cutoff",18,19,"|       AftTouch| |h = left   q = quit      |Pitch",18,78,"|",
  38. 19,0,"|Resonance",19,19,"|Osc.MG",19,35,"| |j = down   N = Set Name  |Duration      |",
  39. 20,0,"|Tracking",20,19,"|VCF",20,35,"| |k = up     J = Decrement |Volume",20,78,"|",
  40. 21,0,"|Polarity",21,19,"|VCA",21,35,"| |l = right  K = Increment |Channel       |",
  41. 22,0,"|EG.Intens",22,19,"|",22,35,"| |",22,63,"|",22,78,"|",
  42. 23,0,"+------------------+---------------+ +-------------------------+--------------+",
  43. -1,-1,NULL
  44. };
  45.  
  46. /* This array defines all the editable parameters. */
  47. struct paraminfo Pdw800[] = {
  48. "autopitch",NULL,    -1,-1, 18, 73, visnum,         0, 127, 60, 0,
  49. "autovol",    NULL,    -1,-1, 19, 73, visnum,         0, 127, 63, 0,
  50. "autodur",    NULL,    -1,-1, 20, 73, visnum,         1,  20,  5, 0,
  51. "autochan",    NULL,    -1,-1, 21, 73, visnum,         1,  16,  1, 0,
  52.  
  53. "o1oct",    NULL,    -1,-1,  4, 10, visd8oct,    0,   3, 0, 0,
  54. "o1wave",    NULL,    -1,-1,  5, 10, visd8wave,    0,  15, 0, 0,
  55. "o1lev",    NULL,    -1,-1,  6, 10, visnum,        0,  31, 0, 0,
  56. "o2oct",    NULL,    -1,-1,  4, 20, visd8oct,    0,   3, 0, 0,
  57. "o2wave",    NULL,    -1,-1,  5, 20, visd8wave,    0,  15, 0, 0,
  58. "o2lev",    NULL,    -1,-1,  6, 20, visnum,        0,  31, 0, 0,
  59. "o2ival",    NULL,    -1,-1,  7, 20, visd8ival,    0,   7, 0, 0,
  60. "o2detu",    NULL,    -1,-1,  8, 20, visd8detu,    0,   7, 0, 0,
  61. "noise",    NULL,    -1,-1,  6, 30, visnum,        0,  31, 0, 0,
  62.  
  63. "mgwave",    NULL,    -1,-1,  4, 46, visd8mgw,    0,   3, 0, 0,
  64. "mgfrew",    NULL,    -1,-1,  5, 46, visnum,        0,  31, 0, 0,
  65. "mgdela",    NULL,    -1,-1,  6, 46, visnum,        0,  31, 0, 0,
  66. "mgosc",    NULL,    -1,-1,  7, 46, visnum,        0,  31, 0, 0,
  67. "mgvcf",    NULL,    -1,-1,  8, 46, visnum,        0,  31, 0, 0,
  68.  
  69. "abndsel",    NULL,    -1,-1,  4, 63, visd8asel,    0,   3, 0, 0,
  70. "abndmod",    NULL,    -1,-1,  5, 63, visd8amod,     0,   1, 0, 0,
  71. "abndtim",    NULL,    -1,-1,  6, 63, visnum,        0,  31, 0, 0,
  72. "abndins",    NULL,    -1,-1,  7, 63, visnum,        0,  31, 0, 0,
  73.  
  74. "mode",        NULL,    -1,-1,  4, 72, visd8mode,    0,   3, 0, 0,
  75.  
  76. "fatt",        NULL,    -1,-1, 11, 11, visnum,        0,  31, 0, 0,
  77. "fdec",        NULL,    -1,-1, 12, 11, visnum,        0,  31, 0, 0,
  78. "fbrk",        NULL,    -1,-1, 13, 11, visnum,        0,  31, 0, 0,
  79. "fslp",        NULL,    -1,-1, 14, 11, visnum,        0,  31, 0, 0,
  80. "fsus",        NULL,    -1,-1, 15, 11, visnum,        0,  31, 0, 0,
  81. "frel",        NULL,    -1,-1, 16, 11, visnum,        0,  31, 0, 0,
  82. "fsens",    NULL,    -1,-1, 17, 11, visnum,        0,   7, 0, 0,
  83. "fcut",        NULL,    -1,-1, 18, 11, visnum,        0,  63, 0, 0,
  84. "fres",        NULL,    -1,-1, 19, 11, visnum,        0,  31, 0, 0,
  85. "ftrk",        NULL,    -1,-1, 20, 11, visd8trk,    0,   3, 0, 0,
  86. "fpol",        NULL,    -1,-1, 21, 11, visd8pol,    0,   1, 0, 0,
  87. "fegi",        NULL,    -1,-1, 22, 11, visnum,        0,  31, 0, 0,
  88. "aatt",        NULL,    -1,-1, 11, 16, visnum,        0,  31, 0, 0,
  89. "adec",        NULL,    -1,-1, 12, 16, visnum,        0,  31, 0, 0,
  90. "abrk",        NULL,    -1,-1, 13, 16, visnum,        0,  31, 0, 0,
  91. "aslp",        NULL,    -1,-1, 14, 16, visnum,        0,  31, 0, 0,
  92. "asus",        NULL,    -1,-1, 15, 16, visnum,        0,  31, 0, 0,
  93. "arel",        NULL,    -1,-1, 16, 16, visnum,        0,  31, 0, 0,
  94. "asens",    NULL,    -1,-1, 17, 16, visnum,        0,   7, 0, 0,
  95.  
  96. "dtim",        NULL,    -1,-1, 11, 30, visnum,        0,   7, 0, 0,
  97. "dfact",    NULL,    -1,-1, 12, 30, visnum,        0,  15, 0, 0,
  98. "dfeed",    NULL,    -1,-1, 13, 30, visnum,        0,  15, 0, 0,
  99. "dfreq",    NULL,    -1,-1, 14, 30, visnum,        0,  31, 0, 0,
  100. "dintns",    NULL,    -1,-1, 15, 30, visnum,        0,  31, 0, 0,
  101. "deff",        NULL,    -1,-1, 16, 30, visnum,        0,  15, 0, 0,
  102.  
  103. "atosc",    NULL,    -1,-1, 19, 27, visnum,        0,   3, 0, 0,
  104. "atvcf",    NULL,    -1,-1, 20, 27, visnum,        0,   3, 0, 0,
  105. "atvca",    NULL,    -1,-1, 21, 27, visnum,        0,   3, 0, 0,
  106.  
  107. "joyosc",    NULL,    -1,-1, 11, 40, visd8sem,    0,  15, 0, 0,
  108. "joyvcf",    NULL,    -1,-1, 12, 40, visonoff,    0,   1, 0, 0,
  109.  
  110. "portam",    NULL,    -1,-1, 11, 58, visnum,        0,  31, 0, 0,
  111.  
  112. "vnumb",    NULL,    -1,-1, 12, 72, dw8vnum,        0,  63, 0, 0,
  113.  
  114. NULL,        NULL,    -1,-1, -1, -1, visnum,         0,   0, 0, 0
  115. };
  116.  
  117. /*
  118.  * dw8vnum
  119.  *
  120.  * Convert a voice number (0 to 63) to the string displayed in the
  121.  * librarian (ie. 11 to 88).
  122.  */
  123.  
  124. char *
  125. dw8vnum(n)
  126. {
  127.     static char v[3];
  128.  
  129.     if ( n < 0 || n > 63 )
  130.         return("??");
  131.  
  132.     v[0] = n/8 + '1';
  133.     v[1] = n%8 + '1';
  134.     v[2] = '\0';
  135.     return(v);
  136. }
  137.  
  138. /*
  139.  * dw8numv
  140.  *
  141.  * Convert a display-style voice number (11 to 88) to internal
  142.  * format (0 - 63).
  143.  */
  144.  
  145. dw8numv(n)
  146. int n;
  147. {
  148.     int ld, rd;
  149.     
  150.     /* crack out the digits as octal codes */
  151.     ld = (n / 10) - 1; /* left digit */
  152.     rd = (n % 10) - 1; /* right digit */
  153.     
  154.     if(ld < 0 || ld > 7 || rd < 0 || rd > 7) {
  155.         return(-1);
  156.     } else {
  157.         return(ld * 8 + rd); /* combine as octal */
  158.     }
  159. }
  160.  
  161. /*
  162.  * dw8din
  163.  *
  164.  * Take library bank 'data' and stuff values in the P array, by using
  165.  * the setval function.
  166.  */
  167.  
  168. dw8din(data)
  169. char *data;
  170. {
  171.     /* The first 20 bytes are reserved (arbitrarily) for the voice name */
  172.     setval("o1oct",data[20]);
  173.     setval("o1wave",data[21]);
  174.     setval("o1lev",data[22]);
  175.     setval("abndsel",data[23]);
  176.     setval("abndmod",data[24]);
  177.     setval("abndtim",data[25]);
  178.     setval("abndins",data[26]);    
  179.     setval("o2oct",data[27]);
  180.     setval("o2wave",data[28]);
  181.     setval("o2lev",data[29]);
  182.     setval("o2ival",data[30]);
  183.     setval("o2detu",data[31]);
  184.     setval("noise",data[32]);
  185.     setval("mode",data[33]);
  186.     setval("vnumb",data[34]);
  187.     setval("fcut",data[35]);
  188.     setval("fres",data[36]);
  189.     setval("ftrk",data[37]);
  190.     setval("fpol",data[38]);
  191.     setval("fegi",data[39]);
  192.     setval("fatt",data[40]);
  193.     setval("fdec",data[41]);
  194.     setval("fbrk",data[42]);
  195.     setval("fslp",data[43]);
  196.     setval("fsus",data[44]);
  197.     setval("frel",data[45]);
  198.     setval("fsens",data[46]);
  199.     setval("aatt",data[47]);
  200.     setval("adec",data[48]);
  201.     setval("abrk",data[49]);
  202.     setval("aslp",data[50]);
  203.     setval("asus",data[51]);
  204.     setval("arel",data[52]);
  205.     setval("asens",data[53]);
  206.     setval("mgwave",data[54]);
  207.     setval("mgfrew",data[55]);
  208.     setval("mgdela",data[56]);
  209.     setval("mgosc",data[57]);
  210.     setval("mgvcf",data[58]);
  211.     setval("joyosc",data[59]);
  212.     setval("joyvcf",data[60]);
  213.     setval("dtim",data[61]);
  214.     setval("dfact",data[62]);
  215.     setval("dfeed",data[63]);
  216.     setval("dfreq",data[64]);
  217.     setval("dintns",data[65]);
  218.     setval("deff",data[66]);
  219.     setval("portam",data[67]);
  220.     setval("atosc",data[68]);
  221.     setval("atvcf",data[69]);
  222.     setval("atvca",data[70]);
  223.  
  224.     /* We set the 'auto-note' channel upon entry */
  225.     setval("autochan",Channel);
  226. }
  227.  
  228. /*
  229.  * dw8dout
  230.  *
  231.  * Take (possibly changed) parameters values out of the P array and
  232.  * put them back into the library bank 'data'.
  233.  */
  234.  
  235. dw8dout(data)
  236. char *data;
  237. {
  238.     data[20] = getval("o1oct");
  239.     data[21] = getval("o1wave");
  240.     data[22] = getval("o1lev");
  241.     data[23] = getval("abndsel");
  242.     data[24] = getval("abndmod");
  243.     data[25] = getval("abndtim");
  244.     data[26] = getval("abndins");
  245.     data[27] = getval("o2oct");
  246.     data[28] = getval("o2wave");
  247.     data[29] = getval("o2lev");
  248.     data[30] = getval("o2ival");
  249.     data[31] = getval("o2detu");
  250.     data[32] = getval("noise");
  251.     data[33] = getval("mode");
  252.     data[34] = getval("vnumb");
  253.     data[35] = getval("fcut");
  254.     data[36] = getval("fres");
  255.     data[37] = getval("ftrk");
  256.     data[38] = getval("fpol");
  257.     data[39] = getval("fegi");
  258.     data[40] = getval("fatt");
  259.     data[41] = getval("fdec");
  260.     data[42] = getval("fbrk");
  261.     data[43] = getval("fslp");
  262.     data[44] = getval("fsus");
  263.     data[45] = getval("frel");
  264.     data[46] = getval("fsens");
  265.     data[47] = getval("aatt");
  266.     data[48] = getval("adec");
  267.     data[49] = getval("abrk");
  268.     data[50] = getval("aslp");
  269.     data[51] = getval("asus");
  270.     data[52] = getval("arel");
  271.     data[53] = getval("asens");
  272.     data[54] = getval("mgwave");
  273.     data[55] = getval("mgfrew");
  274.     data[56] = getval("mgdela");
  275.     data[57] = getval("mgosc");
  276.     data[58] = getval("mgvcf");
  277.     data[59] = getval("joyosc");
  278.     data[60] = getval("joyvcf");
  279.     data[61] = getval("dtim");
  280.     data[62] = getval("dfact");
  281.     data[63] = getval("dfeed");
  282.     data[64] = getval("dfreq");
  283.     data[65] = getval("dintns");
  284.     data[66] = getval("deff");
  285.     data[67] = getval("portam");
  286.     data[68] = getval("atosc");
  287.     data[69] = getval("atvcf");
  288.     data[70] = getval("atvca");
  289.  
  290.     /* If the autochan parameter has changed, update Channel */
  291.     Channel = getval("autochan");
  292. }
  293.  
  294. /*
  295.  * dw8sedit
  296.  *
  297.  * Send a single voice to the edit buffer of the DW8000.  This will be whatever
  298.  * voice is currently selected.
  299.  */
  300.  
  301. dw8sedit(data)
  302. char *data;
  303. {
  304.     int n;
  305.     
  306.     sendmidi(0xf0);
  307.     sendmidi(0x42);
  308.     sendmidi(0x30 | (Channel - 1));
  309.     sendmidi(0x03);
  310.     sendmidi(0x40);
  311.     for(n = 0; n < DW8VSIZE; n++) {
  312.         sendmidi(data[n + 20] & 0x7f);
  313.     }
  314.     sendmidi(EOX);
  315. }
  316.  
  317. /*
  318.  * dw8nof
  319.  *
  320.  * Return a pointer to the voice name buried in library bank data.
  321.  */
  322. char *
  323. dw8nof(data)
  324. char *data;
  325. {
  326.     static char currbuff[17];
  327.     char *p;
  328.     int m;
  329.  
  330.     p = currbuff;
  331.     for ( m=0; m<16; m++ )
  332.         *p++ = data[m];
  333.     *p = '\0';
  334.     return(currbuff);
  335. }
  336.  
  337. /*
  338.  * dw8snof
  339.  *
  340.  * Set the voice name buried in data to name.
  341.  */
  342. dw8snof(data,name)
  343. char *data;
  344. char *name;
  345. {
  346.     char *p;
  347.     int m;
  348.  
  349.     for ( p=name,m=0; *p!='\0' && m<16; p++,m++ )
  350.         data[m] = *p;
  351.     for ( ; m<16; m++ )
  352.         data[m] = ' ';
  353. }
  354.  
  355. /* dw8sone - send a single voice to the DW8000 */
  356. dw8sone(iv, data)
  357. int iv;
  358. char *data;
  359. {
  360.     int c, b2, ret = 1;
  361.     long begin, toolong;
  362.  
  363.     /* select voice n */
  364.     sendmidi(0xc0 | (Channel - 1));
  365.     sendmidi(iv);
  366.     
  367.     /* send data */
  368.     dw8sedit(data);
  369.     
  370.     /* request write */
  371.     sendmidi(0xf0);
  372.     sendmidi(0x42);
  373.     sendmidi(0x30 | (Channel - 1));
  374.     sendmidi(0x03);
  375.     sendmidi(0x11);    /* write request */
  376.     sendmidi(iv);    /* the now-current voice */
  377.     sendmidi(EOX);
  378.     
  379.     /* read the ack/nack - set up for timeout */
  380.     begin = milliclock();
  381.     toolong = begin + 1000 * TIMEOUT;
  382.  
  383.     /* wait for the 0x03 byte (dw8000 ID byte) */
  384.     while ( milliclock() < toolong ) {
  385.         if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x03 )
  386.             break;
  387.     }
  388.     if ( c != 0x03 ) {
  389.         Reason = "Timeout waiting for 0x03";
  390.         goto getout;
  391.     }
  392.     
  393.     /* next byte is the result code */
  394.     while((b2 = getmidi() & 0xff) == 0xfe)
  395.         ; /* burn active sensing */
  396.     if(b2 != 0x21) {
  397.         Reason = "Write failed - check protect switch!";
  398.         goto getout;
  399.     }
  400.  
  401.     while((b2 = getmidi() & 0xff) == 0xfe)
  402.         ;    /* want EOX - burn active sensing */
  403.     if ( b2 != EOX )
  404.         Reason = "EOX not received";
  405.     else {
  406.         Reason = "";
  407.         ret = 0;    /* all's well */
  408.     }
  409.     
  410. getout:
  411.     return(ret);
  412. }
  413.  
  414. /* dw8gbulk - Request and read a bulk dump from the DW8000 */
  415. dw8gbulk(data)
  416. char *data;
  417. {
  418.     int c, n, v, b2, ret = 1;
  419.     long begin, toolong;
  420.  
  421.     flushmidi();
  422.  
  423.     for(v = 0; v < Nvoices; v++) {
  424.         /* select voice */
  425.         sendmidi(0xc0 | (Channel - 1));
  426.         sendmidi(v);
  427.         
  428.         /* request the voice */
  429.         sendmidi(0xf0);
  430.         sendmidi(0x42);
  431.         sendmidi(0x30 | (Channel-1));    /* Channel # */
  432.         sendmidi(0x03);
  433.         sendmidi(0x10);    
  434.         sendmidi(EOX);
  435.     
  436.         /* set up for timeout */
  437.         begin = milliclock();
  438.         toolong = begin + 1000 * TIMEOUT;
  439.     
  440.         /* wait for the x40 byte starting the dump */
  441.         while ( milliclock() < toolong ) {
  442.             if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x40 )
  443.                 break;
  444.         }
  445.         if ( c != 0x40 ) {
  446.             Reason = "Timeout waiting for 0x40";
  447.             goto getout;
  448.         }
  449.         
  450.         /* now read 51 bytes of voice data */
  451.         for(n = 0; n < DW8VSIZE; n++) {
  452.             /* twiddle your thumbs, but not forever */
  453.             while ( ! STATMIDI ) {
  454.                 if ( milliclock() > toolong )
  455.                     goto timeout;    /* the end of an era */
  456.             }
  457.             while((b2 = getmidi() & 0xff) == 0xfe)
  458.                 ; /* burn active sensing */
  459.             VOICEBYTE(data,v,n + 20) = b2;    
  460.         }
  461.  
  462.     timeout:
  463.         if ( n != DW8VSIZE ) {
  464.             Reason = "Timeout while reading!";
  465.             goto getout;
  466.         }
  467.         while((b2 = getmidi() & 0xff) == 0xfe)
  468.             ;    /* want EOX - burn active sensing */
  469.         if ( b2 != EOX )
  470.             Reason = "EOX not received";
  471.         else {
  472.             Reason = "";
  473.             ret = 0;    /* all's well */
  474.         }
  475.     } /* go back for another voice */
  476.     
  477. getout:
  478.     return(ret);
  479. }
  480.  
  481. /*
  482.  * Below are functions used for display of parameter values
  483.  */
  484.  
  485. char *
  486. visd8wave(v)
  487. {
  488.     switch (v) {
  489.     case 0: return("ramp");
  490.     case 1: return("square");
  491.     case 2: return("ac. piano");
  492.     case 3: return("el. piano");
  493.     case 4: return("hd. piano");
  494.     case 5: return("clavinet");
  495.     case 6: return("organ");
  496.     case 7: return("brass");
  497.     case 8: return("sax");
  498.     case 9: return("violin");
  499.     case 10: return("a. guitar");
  500.     case 11: return("d. guitar");
  501.     case 12: return("el. bass");
  502.     case 13: return("dg. bass");
  503.     case 14: return("bell");
  504.     case 15: return("sine");
  505.     }
  506.     return("*");
  507. }
  508.  
  509. char *
  510. visd8oct(v)
  511. {
  512.     switch(v) {
  513.     case 0: return("16");
  514.     case 1: return("8");
  515.     case 2: return("4");
  516.     case 3: return("*");
  517.     }
  518.     return("*");
  519. }
  520.  
  521. char *
  522. visd8ival(v)
  523. {    
  524.     switch(v) {
  525.     case 0: return("unison");
  526.     case 1: return("min 3rd");
  527.     case 2: return("maj 3rd");
  528.     case 3: return("4th");
  529.     case 4: return("5th");
  530.     case 5: case 6: case 7: return("*");
  531.     }
  532.     return("*");
  533. }
  534.  
  535. char *
  536. visd8detu(v)
  537. {
  538.     switch(v) {
  539.     case 0: return("in tune");
  540.     case 1: return("1 cent");
  541.     case 2: return("2 cents");
  542.     case 3: return("3 cents");
  543.     case 4: return("4 cents");
  544.     case 5: return("5 cents");
  545.     case 6: return("6 cents");
  546.     case 7: return("*");
  547.     }
  548.     return("*");
  549. }
  550.  
  551. char *Semicode[] = {
  552.     "none",
  553.     "1 semitone",
  554.     "2 semitones",
  555.     "3 semitones",
  556.     "4 semitones",
  557.     "5 semitones",
  558.     "6 semitones",
  559.     "7 semitones",
  560.     "8 semitones",
  561.     "9 semitones",
  562.     "10 semitones",
  563.     "11 semitones",
  564.     "1 octave"
  565. };
  566.  
  567. char *
  568. visd8sem(v)
  569. {
  570.     if(v >= 0 && v <= 12) {
  571.         return(Semicode[v]);
  572.     }
  573.     return("*");
  574. }
  575.  
  576. char *
  577. visd8asel(v)
  578. {
  579.     switch(v) {
  580.     case 0: return("off");
  581.     case 1: return("Osc 1");
  582.     case 2: return("Osc 2");
  583.     case 3: return("Osc 1+2");
  584.     }
  585.     return("*");
  586. }
  587.  
  588. char *
  589. visd8amod(v)
  590. {
  591.     switch(v) {
  592.     case 0: return("Up");
  593.     case 1: return("Down");
  594.     }
  595.     return("*");
  596. }
  597.  
  598. char *
  599. visd8pol(v)
  600. {
  601.     switch(v) {
  602.     case 0: return("/-\\");
  603.     case 1: return("\\_/");
  604.     }
  605.     return("*");
  606. }
  607.  
  608. char *
  609. visd8mode(v)
  610. {
  611.     switch(v) {
  612.     case 0: return("Poly 1");
  613.     case 1: return("Poly 2");
  614.     case 2: return("Uni 1");
  615.     case 3: return("Uni 2");
  616.     }
  617.     return("*");
  618. }
  619.  
  620. char *
  621. visd8mgw(v)
  622. {
  623.     switch(v) {
  624.     case 0: return("/\\");
  625.     case 1: return("|\\");
  626.     case 2: return("/|");
  627.     case 3: return("_|-|");
  628.     }
  629.     return("*");
  630. }
  631.  
  632. char *
  633. visd8trk(v)
  634. {
  635.     switch(v) {
  636.     case 0: return("0");
  637.     case 1: return("1/4");
  638.     case 2: return("1/2");
  639.     case 3: return("1");
  640.     }
  641.     return("*");
  642. }
  643.  
  644. /* end */
  645.